package pe.com.bbva.targps.action;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

import pe.com.bbva.carga.domain.CargaManual;
import pe.com.bbva.configuracion.bo.ConfArchivoBO;
import pe.com.bbva.configuracion.bo.ConfiguracionBO;
import pe.com.bbva.configuracion.bo.TurnoBO;
import pe.com.bbva.configuracion.domain.ConfArchivo;
import pe.com.bbva.configuracion.domain.Turno;
import pe.com.bbva.mantenimiento.bo.ProveedorBO;
import pe.com.bbva.mantenimiento.bo.TablaBO;
import pe.com.bbva.mantenimiento.domain.Proveedor;
import pe.com.bbva.mantenimiento.domain.Tabla;
import pe.com.bbva.targps.bo.TarjetaBO;
import pe.com.bbva.targps.domain.Tarjeta;
import pe.com.bbva.targps.domain.TarjetaActualizada;
import pe.com.bbva.util.Constantes;
import pe.com.bbva.util.SelectItem;
import pe.com.bbva.util.Util;
import pe.com.stefanini.core.action.GenericAction;
import pe.com.stefanini.core.domain.UsuarioSession;
import pe.com.stefanini.core.exceptions.BOException;
import pe.com.stefanini.core.exceptions.DAOException;
import pe.com.stefanini.core.util.StringUtil;

@Service("tarjetaAction")
@Scope("prototype")
@Results({
	@Result(name="viewListTarjeta",type="tiles", location="viewListTarjeta"),
	@Result(name="viewFormTarjeta",type="tiles", location="viewFormTarjeta"),
	@Result(name="listaTarjetas",type="json",params={"root","grid"}),
	@Result(name="listaConfArchivo",type="json"),
	@Result(name="listaEstadoFinal",type="json")
})
public class TarjetaAction extends GenericAction {
	private static final long serialVersionUID = 1L;

	private Logger logger = Logger.getLogger(this.getClass());

	@Resource
	private TarjetaBO tarjetaBO;
	
	@Resource
	private TurnoBO turnoBO;
	
	@Resource
	private TablaBO tablaBO;
	
	@Resource
	private ConfArchivoBO confArchivoBO;
	
	@Resource
	private ProveedorBO proveedorBO;
	
	@Resource
	private ConfiguracionBO configuracionBO;

	private Long idTarjeta;
	private Tarjeta tarjeta;
	private Tarjeta tarjetaBuscar;
	private TarjetaActualizada tarjetaActualizada;
	private Tabla tipoDocumento;
	private Tabla tipoArchivo;
	
	private Long idTurno;
	private String fecBusInicio;
	private String fecBusFin;
	private String fechaInicio;
	private String fechaFin;
	private Long estado;
	
	private List<Turno> listaTurno;
	private List<CargaManual> listaConfArchivo;
	private List<TarjetaActualizada> listaTarjetas;
	private List<SelectItem> listaEstado;
	private List<SelectItem> listaEstadoEdicion;

	public void cleanForm() {
		Date date = new Date();
		setTarjeta(new Tarjeta());
		setTarjetaBuscar(new Tarjeta());
		setFechaInicio(Util.getFormatoFecha(date));
		setFechaFin(Util.getFormatoFecha(date));
		setIdTarjeta(null);
		setIdTurno(null);
		listaConfArchivo = new ArrayList<CargaManual>();
	}
	
	@Action(value="initActTarjetas")
	public String init() {
		tarjetaBuscar = new Tarjeta();
		Date date = new Date();
		setFechaInicio(Util.getFormatoFecha(date));
		setFechaFin(Util.getFormatoFecha(date));
		return "viewListTarjeta";
	}
	
	@Action(value="findAllTarjetas")
	public String findAll() {
		try {
			if(tarjetaBuscar==null){
				tarjetaBuscar = new Tarjeta();
			}
			if(getFechaInicio() == null || getFechaInicio().equals("")){
				if(!fecBusInicio.equals(""))
					setFechaInicio(fecBusInicio);
			}
			if(getFechaFin() == null || getFechaFin().equals("")){
				if(!fecBusFin.equals(""))
					setFechaFin(fecBusFin);
			}
			tarjetaBuscar.setEstadoFacturacion(String.valueOf(Constantes.ESTADO_PROCESO_NO_FACTURADO));
			List<Tarjeta> tarjetas = tarjetaBO.findTarjetasRango(tarjetaBuscar, fechaInicio, fechaFin);
			List<TarjetaActualizada> tarjetasGrid = new ArrayList<TarjetaActualizada>();
			for(Tarjeta tarjeta: tarjetas){
				if(tarjeta.getEstado().equals(String.valueOf(Constantes.ESTADO_TARJETA_NO_RETORNADO)) ||
					tarjeta.getEstado().equals(String.valueOf(Constantes.ESTADO_TARJETA_FALTANTE)))
				{
					TarjetaActualizada tarjetaGrid = new TarjetaActualizada();
					tarjetaGrid.setId(tarjeta.getId());
					tarjetaGrid.setNumTarjeta(tarjeta.getNumTarjeta());
					tarjetaGrid.setCodigo(tarjeta.getCodTarjeta());
					if(tarjeta.getTipoArchivo()!=null){
						Tabla tablaTipoArchivo = tablaBO.findById(Long.valueOf(tarjeta.getTipoArchivo()));
						tarjetaGrid.setTipoArchivo(tablaTipoArchivo.getDescripcion());
					}
					if(tarjeta.getCodCourier()!=null){
						Tabla tablaTipoProveedor = tablaBO.findById(Constantes.PROVEEDOR_TIPO_COURIER);
						Proveedor proveedorBuscar = new Proveedor();
						proveedorBuscar.setCodigoProveedor(tarjeta.getCodCourier());
						proveedorBuscar.setTipo(tablaTipoProveedor);
						List<Proveedor> proveedores = proveedorBO.findProveedores(proveedorBuscar);
						if(proveedores!=null && proveedores.size() == 1){
							Proveedor proveedor = proveedores.get(0); 
							tarjetaGrid.setIdProveedor(String.valueOf(proveedor.getId()));
							tarjetaGrid.setCourier(proveedor.getNombre());
						}
					}
					tarjetaGrid.setIdTurno(String.valueOf(tarjeta.getIdTurno()));
					tarjetaGrid.setReferencia(tarjeta.getReferencia());
					tarjetaGrid.setFechaTurno(Util.getFormatoFecha(tarjeta.getFechaProceso()) + "-" + String.valueOf(tarjeta.getIdTurno()));
					
					Tabla tablaPadreOfi = new Tabla();
					tablaPadreOfi.setId(Constantes.ID_TABLA_OFICINA);
					Tabla tablaBuscOfi = new Tabla();
					tablaBuscOfi.setPadre(tablaPadreOfi);
					tablaBuscOfi.setCodigo(tarjeta.getOficina());
					List<Tabla> tablaOficina = tablaBO.findTablas(tablaBuscOfi);
					if(tablaOficina != null && !tablaOficina.isEmpty()){
						tarjetaGrid.setOficina(tablaOficina.get(0).getDescripcion());
					}
					
					Tabla tablaPadreSol = new Tabla();
					tablaPadreSol.setId(Constantes.ID_TABLA_TIPO_SOLICITUD);
					Tabla tablaBuscSol = new Tabla();
					tablaBuscSol.setPadre(tablaPadreSol);
					tablaBuscSol.setCodigo(tarjeta.getTipoSolicitud());
					List<Tabla> tablaSolicitud = tablaBO.findTablas(tablaBuscSol);
					if(tablaSolicitud!=null && !tablaSolicitud.isEmpty()){
						tarjetaGrid.setSolicitud(tablaSolicitud.get(0).getDescripcion());
					}
					
					Tabla tablaPadre = new Tabla();
					tablaPadre.setId(Constantes.ID_TABLA_TAMANIO);
					Tabla tablaBuscar = new Tabla();
					tablaBuscar.setPadre(tablaPadre);
					tablaBuscar.setCodigo(tarjeta.getTamanio());
					List<Tabla> tablaTamanio = tablaBO.findTablas(tablaBuscar);
					if(tablaTamanio!=null && !tablaTamanio.isEmpty()){
						tarjetaGrid.setTamanio(tablaTamanio.get(0).getDescripcion());
					}
					
					Tabla tablaEstado = tablaBO.findById(Long.valueOf(tarjeta.getEstado()));
					tarjetaGrid.setEstado(tablaEstado.getDescripcion());
					tarjetasGrid.add(tarjetaGrid);
				}
			}
			setGrid(tarjetaBO.findToGridRango(tarjetasGrid, getSidx()+" "+getSord(),getPage(),getRows()));
			if(getGrid().getRecords().equals(new Integer(0))){
				addActionError("No se encontraron resultados");
			}
		} catch (BOException e) {
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
		}
		return "listaTarjetas";
	}
	
	@Action(value="updateTarjeta")
	public String updateForm() {
		try {
			tarjetaActualizada = new TarjetaActualizada();
			tarjeta = tarjetaBO.findById(idTarjeta);
			tarjetaActualizada.setId(tarjeta.getId());
			tarjetaActualizada.setNumTarjeta(tarjeta.getNumTarjeta());
			tarjetaActualizada.setCodigo(tarjeta.getCodTarjeta());
			tarjetaActualizada.setEstado(tarjeta.getEstado());
			if(tarjeta.getTipoArchivo()!=null){
				Tabla tablaTipoArchivo = tablaBO.findById(Long.valueOf(tarjeta.getTipoArchivo()));
				tarjetaActualizada.setTipoArchivo(tablaTipoArchivo.getDescripcion());
			}
			
			if(tarjeta.getCodCourier()!=null){
				Tabla tablaTipoProveedor = tablaBO.findById(Constantes.PROVEEDOR_TIPO_COURIER);
				Proveedor proveedorBuscar = new Proveedor();
				proveedorBuscar.setCodigoProveedor(tarjeta.getCodCourier());
				proveedorBuscar.setTipo(tablaTipoProveedor);
				List<Proveedor> proveedores = proveedorBO.findProveedores(proveedorBuscar);
				if(proveedores!=null && proveedores.size() == 1){
					Proveedor proveedor = proveedores.get(0); 
					tarjetaActualizada.setIdProveedor(String.valueOf(proveedor.getId()));
					tarjetaActualizada.setCourier(proveedor.getNombre());
				}
			}
						
			Tabla tablaPadreTipDoc = new Tabla();
			tablaPadreTipDoc.setId(Constantes.ID_TABLA_TIPO_DOCUMENTO);
			Tabla tablaBuscarTipDoc = new Tabla();
			tablaBuscarTipDoc.setPadre(tablaPadreTipDoc);
			tablaBuscarTipDoc.setValor(tarjeta.getTipoDocumento());
			Tabla tablaTipDoc = tablaBO.findTablas(tablaBuscarTipDoc).get(0);
			tarjetaActualizada.setTipoDocumento(tablaTipDoc.getDescripcion());
			tarjetaActualizada.setNumTipoDocumento(tarjeta.getNumDocumento());
			tarjetaActualizada.setOficina(tarjeta.getOficina());
			Tabla tablaPadreSol = new Tabla();
			
			tablaPadreSol.setId(Constantes.ID_TABLA_TIPO_SOLICITUD);
			Tabla tablaBuscSol = new Tabla();
			tablaBuscSol.setPadre(tablaPadreSol);
			tablaBuscSol.setCodigo(tarjeta.getTipoSolicitud());
			Tabla tablaSolicitud = tablaBO.findTablas(tablaBuscSol).get(0);
			tarjetaActualizada.setSolicitud(tablaSolicitud.getDescripcion());
			
			tarjetaActualizada.setReferencia(tarjeta.getReferencia());
			Tabla tablaPadreTam = new Tabla();
			tablaPadreTam.setId(Constantes.ID_TABLA_TAMANIO);
			Tabla tablaBuscarTam = new Tabla();
			tablaBuscarTam.setPadre(tablaPadreTam);
			tablaBuscarTam.setCodigo(tarjeta.getTamanio());
			Tabla tablaTamanio = tablaBO.findTablas(tablaBuscarTam).get(0);
			tarjetaActualizada.setTamanio(tablaTamanio.getDescripcion());
			tarjetaActualizada.setFechaTurno(Util.getFormatoFecha(tarjeta.getFechaProceso()));
			Turno turno = turnoBO.findById(tarjeta.getIdTurno());
			tarjetaActualizada.setIdTurno(String.valueOf(turno.getId()));
			tarjetaActualizada.setTurnoDesc(turno.getDescripcion());
			
			listaEstadoEdicion = new ArrayList<SelectItem>();
			listaEstadoEdicion.add(new SelectItem("", Constantes.VAL_DEFAULT_SELECTION));
			if(tarjeta.getEstado().equals(String.valueOf(Constantes.ESTADO_TARJETA_FALTANTE))){
				//faltante - no entregado - entregado
				Tabla faltante = tablaBO.findById(Constantes.ESTADO_TARJETA_FALTANTE);
				Tabla estampado = tablaBO.findById(Constantes.ESTADO_TARJETA_ESTAMPADO);
				Tabla noEntregado = tablaBO.findById(Constantes.ESTADO_TARJETA_NO_ENTREGADO);
				listaEstadoEdicion.add(new SelectItem(faltante.getId().toString(), faltante.getDescripcion()));
				listaEstadoEdicion.add(new SelectItem(estampado.getId().toString(), estampado.getDescripcion()));
				listaEstadoEdicion.add(new SelectItem(noEntregado.getId().toString(), noEntregado.getDescripcion()));
			}
			if(tarjeta.getEstado().equals(String.valueOf(Constantes.ESTADO_TARJETA_NO_RETORNADO))){
				//no retornado - no estampado - estampado
				Tabla noRetornado = tablaBO.findById(Constantes.ESTADO_TARJETA_NO_RETORNADO);
				Tabla estampado = tablaBO.findById(Constantes.ESTADO_TARJETA_ESTAMPADO);
				Tabla noEstampado = tablaBO.findById(Constantes.ESTADO_TARJETA_NO_ESTAMPADO);
				listaEstadoEdicion.add(new SelectItem(noRetornado.getId().toString(), noRetornado.getDescripcion()));
				listaEstadoEdicion.add(new SelectItem(estampado.getId().toString(), estampado.getDescripcion()));
				listaEstadoEdicion.add(new SelectItem(noEstampado.getId().toString(), noEstampado.getDescripcion()));
			}
		} catch (BOException e) {
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
		}
		return "viewFormTarjeta";
	}

	@Action(value="saveTarjeta")
	public String save() {
		String forward = "viewListTarjeta";
		String mensaje = "";
		mensaje = "Actualizado Correctamente";
		try {
			tarjeta = tarjetaBO.findById(tarjetaActualizada.getId());
			UsuarioSession usuarioSession = (UsuarioSession) getObjectSession(Constantes.USUARIO_SESSION);
			setCamposAuditoria(tarjeta, usuarioSession);
			Tabla tablaEstado = tablaBO.findById(Long.valueOf(tarjeta.getEstado()));
			String estadoInicial = tablaEstado.getDescripcion();
			tablaEstado = tablaBO.findById(Long.valueOf(tarjetaActualizada.getEstado()));
			String estadoFinal = tablaEstado.getDescripcion();
			tarjeta.setEstado(String.valueOf(tarjetaActualizada.getEstado()));
			tarjetaBO.update(tarjeta);
			configuracionBO.enviarEmailTarjeta(tarjeta.getNumTarjeta(), estadoInicial, estadoFinal, usuarioSession.getNombres());
			addActionMessage(mensaje);
			cleanForm();
		} catch (BOException e) {
			addActionError(e.getMessage());
			logger.error(StringUtil.getStackTrace(e));
			forward = "viewFormTarjeta";
		} catch (Exception e) {
			addActionError(e.getMessage());
			logger.error(StringUtil.getStackTrace(e));
			forward = "viewFormTarjeta";
		}
		return forward;
	}
	
	@Action(value="findAllConfigurationTarjeta")
	public String findAllConfiguration() {
		try {
			ConfArchivo archivoBuscar = new ConfArchivo();
			archivoBuscar.setTurno(turnoBO.findById(idTurno));
			List<ConfArchivo> archivosConfigurados = confArchivoBO.findConfArchivo(archivoBuscar);
			List<CargaManual> listaTmp = new ArrayList<CargaManual>();
			for(ConfArchivo archivoConfigurado:archivosConfigurados){
				if(archivoConfigurado.getEstado().equals(Constantes.ESTADO_ACTIVO)){
					CargaManual cargaManual = new CargaManual();
					cargaManual.setIdTurno(idTurno);
					cargaManual.setIdEquipo(archivoConfigurado.getEquipo().getId());
					cargaManual.setNombreEquipo(archivoConfigurado.getEquipo().getDescripcion());
					listaTmp.add(cargaManual);	
				}
			}
			setListaConfArchivo(listaTmp);
		} catch (BOException e) {
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
		}
		return "listaConfArchivo";
	}
	
	@Action(value="findFinalState")
	public String findFinalState() throws BOException, DAOException {
		listaEstadoEdicion = new ArrayList<SelectItem>();
		listaEstadoEdicion.add(new SelectItem("", Constantes.VAL_DEFAULT_SELECTION));
		if(getEstado().equals(Constantes.ESTADO_TARJETA_FALTANTE)){
			//faltante - no entregado - entregado
			Tabla faltante = tablaBO.findById(Constantes.ESTADO_TARJETA_FALTANTE);
			Tabla estampado = tablaBO.findById(Constantes.ESTADO_TARJETA_ESTAMPADO);
			Tabla noEntregado = tablaBO.findById(Constantes.ESTADO_TARJETA_NO_ENTREGADO);
			listaEstadoEdicion.add(new SelectItem(faltante.getId().toString(), faltante.getDescripcion()));
			listaEstadoEdicion.add(new SelectItem(estampado.getId().toString(), estampado.getDescripcion()));
			listaEstadoEdicion.add(new SelectItem(noEntregado.getId().toString(), noEntregado.getDescripcion()));
		}
		if(getEstado().equals(Constantes.ESTADO_TARJETA_NO_RETORNADO)){
			//no retornado - no estampado - estampado
			Tabla noRetornado = tablaBO.findById(Constantes.ESTADO_TARJETA_NO_RETORNADO);
			Tabla estampado = tablaBO.findById(Constantes.ESTADO_TARJETA_ESTAMPADO);
			Tabla noEstampado = tablaBO.findById(Constantes.ESTADO_TARJETA_NO_ESTAMPADO);
			listaEstadoEdicion.add(new SelectItem(noRetornado.getId().toString(), noRetornado.getDescripcion()));
			listaEstadoEdicion.add(new SelectItem(estampado.getId().toString(), estampado.getDescripcion()));
			listaEstadoEdicion.add(new SelectItem(noEstampado.getId().toString(), noEstampado.getDescripcion()));
		}
		return "listaEstadoFinal";
	}

	public Long getIdTarjeta() {
		return idTarjeta;
	}

	public void setIdTarjeta(Long idTarjeta) {
		this.idTarjeta = idTarjeta;
	}

	public Tarjeta getTarjetaBuscar() {
		return tarjetaBuscar;
	}

	public void setTurnoBuscar(Tarjeta tarjetaBuscar) {
		this.tarjetaBuscar = tarjetaBuscar;
	}

	public void setTarjeta(Tarjeta tarjeta) {
		this.tarjeta = tarjeta;
	}

	public Tarjeta getTarjeta() {
		return tarjeta;
	}

	public String getFechaInicio() {
		return fechaInicio;
	}

	public void setFechaInicio(String fechaInicio) {
		this.fechaInicio = fechaInicio;
	}

	public String getFechaFin() {
		return fechaFin;
	}

	public void setFechaFin(String fechaFin) {
		this.fechaFin = fechaFin;
	}

	public void setTarjetaBuscar(Tarjeta tarjetaBuscar) {
		this.tarjetaBuscar = tarjetaBuscar;
	}

	public List<Turno> getListaTurno() throws BOException, DAOException {
		Turno turnoBuscar = new Turno();
		turnoBuscar.setEstado("1");
		listaTurno = turnoBO.findTurnos(turnoBuscar);
		if(listaTurno==null){
			listaTurno = new ArrayList<Turno>();
		}
		setListaConfArchivo(new ArrayList<CargaManual>());
		return listaTurno;
	}

	public void setListaTurno(List<Turno> listaTurno) {
		this.listaTurno = listaTurno;
	}

	public List<CargaManual> getListaConfArchivo() {
		return listaConfArchivo;
	}

	public void setListaConfArchivo(List<CargaManual> listaConfArchivo) {
		this.listaConfArchivo = listaConfArchivo;
	}

	public List<TarjetaActualizada> getListaTarjetas() {
		return listaTarjetas;
	}

	public void setListaTarjetas(List<TarjetaActualizada> listaTarjetas) {
		this.listaTarjetas = listaTarjetas;
	}

	public void setListaEstado(List<SelectItem> listaEstado) {
		this.listaEstado = listaEstado;
	}

	public List<SelectItem> getListaEstado() throws BOException, DAOException {
		listaEstado = new ArrayList<SelectItem>();
		listaEstado.add(new SelectItem("", Constantes.VAL_DEFAULT_SELECTION_TODOS));
		Tabla faltante = tablaBO.findById(Constantes.ESTADO_TARJETA_FALTANTE);
		Tabla noRetornado = tablaBO.findById(Constantes.ESTADO_TARJETA_NO_RETORNADO);
		listaEstado.add(new SelectItem(faltante.getId().toString(), faltante.getDescripcion()));
		listaEstado.add(new SelectItem(noRetornado.getId().toString(), noRetornado.getDescripcion()));
		return listaEstado;
	}
	
	public void setListaEstadoEdicion(List<SelectItem> listaEstadoEdicion) {
		this.listaEstadoEdicion = listaEstadoEdicion;
	}

	public List<SelectItem> getListaEstadoEdicion() throws BOException, DAOException {
		return listaEstadoEdicion;
	}

	public Tabla getTipoDocumento() {
		return tipoDocumento;
	}

	public void setTipoDocumento(Tabla tipoDocumento) {
		this.tipoDocumento = tipoDocumento;
	}

	public Tabla getTipoArchivo() {
		return tipoArchivo;
	}

	public void setTipoArchivo(Tabla tipoArchivo) {
		this.tipoArchivo = tipoArchivo;
	}
	
	public String getFecBusInicio() {
		return fecBusInicio;
	}

	public void setFecBusInicio(String fecBusInicio) {
		fecBusInicio = fecBusInicio.replaceAll("[,]?[\\s]+", "");
		this.fecBusInicio = fecBusInicio;
	}
	
	public String getFecBusFin() {
		return fecBusFin;
	}

	public void setFecBusFin(String fecBusFin) {
		fecBusFin = fecBusFin.replaceAll("[,]?[\\s]+", "");
		this.fecBusFin = fecBusFin;
	}

	public void setTarjetaActualizada(TarjetaActualizada tarjetaActualizada) {
		this.tarjetaActualizada = tarjetaActualizada;
	}

	public TarjetaActualizada getTarjetaActualizada() {
		return tarjetaActualizada;
	}

	public void setIdTurno(Long idTurno) {
		this.idTurno = idTurno;
	}

	public Long getIdTurno() {
		return idTurno;
	}

	public Long getEstado() {
		return estado;
	}

	public void setEstado(Long estado) {
		this.estado = estado;
	}
}